//
// Created by Lin on 2023/3/26.
//23春伴学挑战赛02：C++语言  难度: 中
// 用int 二维数组 出题老师的方法
//题目描述
//查看题目信息
// http://www.aisichuang.com/ascts/change/toQuestionDetails.do?graType=0&queId=3189&claOrConId=136
//李老师受到经典的 “数字三角形” 问题的启发，将规律改成：
//
//f[i][j]=(f[i−1][j]+f[i−1][j+1])%10
//
//即：当前位置的数字 =(正上方的数字 + 右上方的数字)%10
//
//当给定第一行的 n 个数字 (0≤x≤9) 之后，则可以推导出一个 “倒置” 的数字三角形。
//
//例如 n=5 ，假设第一行的数字依次为 1,2,3,4,51,2,3,4,5 时，数字三角形为：
//
//12345
//3579
//826
//08
//8
//
//现在，李老师对它做出如下处理：每行只保留一个数字不变，其他的数字都用 ? “覆盖” 掉。
//
//例如：
/**
5
??3??
3???
??6
0?
8
**/
//你的任务：根据给出的 “覆盖” 之后的数字三角形，推导出 “覆盖” 之前的数字三角形。
//输入格式
//
//第一行一个整数 n(2≤n≤50)，为数字三角形的行数。
//
//接下来的 n 行，第 1 行有 n 个数字，第 2 行有 n−1 个数字，第 3 行有 n−2 个数字，……，第 n 行有 1 个数字，被 “覆盖” 的数字均用 ? 表示。
//输出格式
//
//输出 “覆盖” 之前的数字三角形。
//样例输入
//
//5
//??3??
//3???
//??6
//0?
//8
//
//样例输出
//
//12345
//3579
//826
//08
//8

#include <iostream>

using namespace std;

int main()
{
    int n;
//    scanf("%d", &n);
    cin>>n;
    int arr[n][n];
    char c;
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n - i; ++j)
        {
//            scanf("%c", &c);
            cin>>c;
            if (c == '?')
            { arr[i][j] = -1; }
            else
            {
                arr[i][j] = c-'0';
            }
        }
    }
    printf("\n");

    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n - i; ++j)
        {
            printf(" %d ", arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

